package com.jc.order.dto;

import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;


/**
 * 投保对象
 */
@Data
public class JcPolicyDTO implements Serializable {
    private static final long serialVersionUID = -1L;


    // 公共核心字段
    /**
     * 主键ID
     */
    private Long id;

    /**
     * 产品代码
     * <p>
     * 传统货运	1
     * 跨境大货	2
     */
    private String productCode;

    /**
     * 原单号
     */
    private String orderNumber;

    /**
     * 提单号 / 运单号
     */
    private String waybillNumber;


    /**
     * 投保单号
     */
    private String snNo;

    /**
     * 保单号
     */
    private String insuranceSn;

    /**
     * 申请人用户编号
     */
    private Long userId;

    /**
     * 批次ID
     */
    private String batchId;

    // 投保人信息
    /**
     * 投保委托人
     */
    private String policyholder;

    /**
     * 投保人类型
     */
    private Byte policyholderType;

    /**
     * 投保联系人
     */
    private String policyholderContact;

    /**
     * 投保人联系电话
     */
    private String policyholderPhone;

    // 被保险人信息
    /**
     * 被保险人姓名/企业名称
     */
    private String insured;

    /**
     * 被保险人类型
     */
    private Byte insuredType;

    /**
     * 被保险人证件号
     */
    private String insuredId;

    /**
     * 被保险人联系电话
     */
    private String insuredPhone;

    /**
     * 被保险人联系地址
     */
    private String insuredAddress;

    // 运输信息
    /**
     * 干线运输方式
     */
    private Integer transportType;

    /**
     * 运输工具名称
     */
    private String transportName;

    /**
     * 起运国家
     */
    private String fromCountry;

    /**
     * 起运详细地址
     */
    private String fromAddress;

    /**
     * 中转国家
     */
    private String transferCountry;

    /**
     * 中转地址
     */
    private String transferAddress;

    /**
     * 目的国家
     */
    private String toCountry;

    /**
     * 目的地址
     */
    private String toAddress;

    /**
     * 赔付地点
     */
    private String compensationLocation;

    // 时间信息
    /**
     * 起运日期
     */
    private Date startTime;

    // 货物信息
    /**
     * 货物类别
     */
    private Integer goodsType;

    /**
     * 货物描述
     */
    private String goodsNote;

    /**
     * 货物包装类型
     */
    private String goodsPackage;

    /**
     * 总包装数量
     */
    private Integer packageCount;

    /**
     * 总重量（公斤）
     */
    private BigDecimal weightPackaged;

    // 保险条款
    /**
     * 暴动保障 (true-启用)
     */
    private Boolean riotProtection;

    // 金额相关
    /**
     * 币种 (如USD/CNY)
     */
    private String currency;

    /**
     * 货物申报价值
     */
    private BigDecimal goodsValueAmount;

    /**
     * 保险加成比例
     */
    private BigDecimal appendPercent;

    /**
     * 投保金额
     */
    private BigDecimal insuranceAmount;

    // 系统字段
    /**
     * 流程实例ID
     */
    private String processInstanceId;

    /**
     * 创建人
     */
    private String creator;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新人
     */
    private String updater;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 删除标记
     */
    private Boolean deleted;

    /**
     * 租户ID
     */
    private Long tenantId;

    // 金融相关
    /**
     * 服务费用（保费）已转RMB
     */
    private BigDecimal fee;

    /**
     * 费率
     */
    private BigDecimal feeRate;


    /**
     * 原费率
     */
    private BigDecimal originalFeeRate;
    /**
     * 原价
     */
    private BigDecimal originalFee;


//    private String discount;

    /**
     * 汇率
     */
    private BigDecimal exchangeRate;

    // 附件信息
    /**
     * 保单文件路径
     */
    private String insuranceFile;

    /**
     * 信用证号码
     */
    private String creditNumber;

    /**
     * 信用证条款
     */
    private String creditTerms;


    /**
     * 物流结算币种 (运费)
     */
    private String deliveryCurrency;

    /**
     * 物流费用金额(运费)
     */
    private BigDecimal deliveryAmount;

    /**
     * 物流汇率 (运费)
     */
    private BigDecimal deliveryExchangeRate;


    /**
     * 业务备注
     */
    private String note;

    // 状态相关
    /**
     * 保额确定方式
     * <p>
     * 货值x加成比例	1
     * 货值加运费	2
     */
    private Integer insuranceConfirmType;

    /**
     * 业务状态
     */
    private Byte status;

    /**
     * 流程处理消息
     */
    private String processMessage;

    /**
     * 货物描述附件
     */
    private String goodsNoteFile;


    // 人民币金额（计算字段）
    /**
     * RMB保费  fee 已经是转换RMB 的值了， 这个作废；
     */
    @Deprecated
    private BigDecimal rmbPremium;

    /**
     * RMB保额
     */
    private BigDecimal rmbSumInsured;

    /**
     * 折扣前保费
     */
    private BigDecimal premiumBeforeDiscount;


    /**
     * 版本
     */
    private Integer versionType;


    private Integer feeVersionType;


    /**
     * 投保
     * 保费计算  PREMIUM_CALCULATION
     */
    private String logic;


    //跨境业务特有字段
    /**
     * 派送方式
     */
    private Integer dispatchType;

    /**
     * 目的地类型
     */
    private Byte destType;

    /**
     * 快递公司名称
     */
    private String expressCompany;

    /**
     * 快递单号
     */
    private String expressTrackingNumber;

    /**
     * 入仓编号
     */
    private String warehousingNumber;

    /**
     * 上架保障
     */
    private Integer shelfGuarantee;

    // 特殊保险条款
    /**
     * 保丢不保损条款
     */
    private Boolean lostCareOnly;

    /**
     * 战争险保障
     */
    private Boolean warProtection;

    /**
     * 回邮附加责任
     */
    private Boolean returnProtection;

    /**
     * 送错地址保障
     */
    private Boolean incorrectDispatchProtection;

    // 附加信息


    /**
     * 货物包装照片
     */
    private String goodsPackageImages;


    /**
     * 货值区分标识
     */
    private String valueDifferentiation;

    /**
     * 快递单附件
     */
    private String expressTrackingNumberFile;


    // 传统保险特有字段
    /**
     * 仓至仓条款要求 (true-需要)
     */
    private Boolean warehouseTermsRequired;

    /**
     * 商业发票号码
     */
    private String invoiceNumber;

    /**
     * 销售合同编号
     */
    private String contractNumber;

    /**
     * 起运日期显示方式
     */
    private Byte startTimeDisplayMode;


    private String callbackApiUrl;


    /**
     * 服务费用（保费）原币别保费 原保单币种的 保费，未转RMB的金额
     */
    private BigDecimal premium;


    /**
     * 附件
     */
    private List<PolicyAttachmentDTO> attachmentList;




    // 公共方法
    public BigDecimal getRmbPremiumBeforeDiscount() {
        return BigDecimal.valueOf(0);
    }

    public BigDecimal getRmbSumInsured() {
        if (insuranceAmount != null && exchangeRate != null) {
            this.rmbSumInsured = this.insuranceAmount.multiply(exchangeRate).setScale(2, BigDecimal.ROUND_HALF_UP);
            return rmbSumInsured;
        } else {
            return BigDecimal.valueOf(0);
        }
    }

//    public BigDecimal getRmbPremium() {
//        if (exchangeRate != null && fee != null) {
//            rmbPremium = this.fee.multiply(exchangeRate).setScale(2, BigDecimal.ROUND_HALF_UP);
//            return rmbPremium;
//        } else {
//            return BigDecimal.valueOf(0);
//        }
//    }


}
